#include "ABMAutoAdmin.h"
#include "ui_ABMAutoAdmin.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel *autoAdmin_model;

ABMAutoAdmin::ABMAutoAdmin(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ABMAutoAdmin)
{
    ui->setupUi(this);
    setWindowFlags(Qt::WindowCloseButtonHint);

    autoAdmin_model = new QSqlRelationalTableModel(this,enjoylifedb);
    autoAdmin_model->setTable("autoadministrable");
    autoAdmin_model->setEditStrategy(QSqlRelationalTableModel::OnFieldChange);

    autoAdmin_model->setHeaderData(2, Qt::Horizontal, "Sección Autoadmin...");
    autoAdmin_model->setHeaderData(3, Qt::Horizontal, "Link");
    autoAdmin_model->setHeaderData(4, Qt::Horizontal, "Usuario");
    autoAdmin_model->setHeaderData(5, Qt::Horizontal, "Contraseña");

    ui->autoAdmin_view->setModel(autoAdmin_model);
    ui->autoAdmin_view->hideColumn(0);
    ui->autoAdmin_view->hideColumn(1);
    ui->autoAdmin_view->setAlternatingRowColors(true);
    ui->autoAdmin_view->setGridStyle(Qt::SolidLine);
    ui->autoAdmin_view->sortByColumn(0,Qt::SortOrder());
    ui->autoAdmin_view->horizontalHeader()->setStretchLastSection(true);
    ui->autoAdmin_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->autoAdmin_view->setColumnWidth(2, 200);
    ui->autoAdmin_view->setColumnWidth(3, 250);

    on_add_autoAdmin = false;
    on_edit_autoAdmin = false;
    row_edited = -1;

    ui->editarBtn->setEnabled(false);
    ui->eliminarBtn->setEnabled(false);
    ui->seccion->clear();
    ui->link->clear();
    ui->usuario->clear();
    ui->contrasenia->clear();
    ui->seccion->setEnabled(false);
    ui->link->setEnabled(false);
    ui->usuario->setEnabled(false);
    ui->contrasenia->setEnabled(false);
    ui->label_sec->setEnabled(false);
    ui->label_link->setEnabled(false);
    ui->label_us->setEnabled(false);
    ui->label_pass->setEnabled(false);

    SelectAutoadmins();
}

ABMAutoAdmin::~ABMAutoAdmin()
{
    delete ui;
}

/*
 *
 */
void ABMAutoAdmin::GetClientDomainsInfo(QString raz_soc)
{
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select nro_cliente, logo_cliente from cliente where razon_social = ";
    stm.append("\'");
    stm.append(raz_soc);
    stm.append("\'");

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query->lastError().text());
        return;
    }

    while (query->next()) {
        ui->nro_cliente->setText(query->value(query->record().indexOf("nro_cliente")).toString());
        ui->razon_social->setText(raz_soc);

        QPixmap* pixmap = new QPixmap();
        pixmap->loadFromData(QByteArray::fromBase64(query->value(query->record().indexOf("logo_cliente")).toByteArray()));

        if (!pixmap->isNull())
            ui->logo_cliente->setPixmap(*pixmap);
    }

    filterAutoAdmin = "a_razon_social = '" + raz_soc + "'";
    SelectAutoadmins();
}

/*
 *
 */
void ABMAutoAdmin::SelectAutoadmins()
{
    autoAdmin_model->setTable("autoadministrable");
    autoAdmin_model->setFilter(filterAutoAdmin);
    enjoylifedb.transaction();
    if (!autoAdmin_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
}

/*
 *
 */
void ABMAutoAdmin::on_agregarBtn_clicked()
{
    if (!ui->seccion->text().isEmpty()) {
        QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("Alerta!"),
                                       "Actualmente está editando una Sección, "
                                       "quiere cancelar la operación e ingresar una nuevo?",
                                       QMessageBox::Yes | QMessageBox::No);

        if (button == QMessageBox::Yes) {
            ui->seccion->clear();
            ui->link->clear();
            ui->usuario->clear();
            ui->contrasenia->clear();
            ui->seccion->setEnabled(true);
            ui->link->setEnabled(true);
            ui->usuario->setEnabled(true);
            ui->contrasenia->setEnabled(true);
            ui->label_sec->setEnabled(true);
            ui->label_link->setEnabled(true);
            ui->label_us->setEnabled(true);
            ui->label_pass->setEnabled(true);
            ui->seccion->setFocus();
            on_add_autoAdmin = true;
            on_edit_autoAdmin = false;
            ui->editarBtn->setEnabled(false);
            ui->eliminarBtn->setEnabled(false);
            return;
        }
    }
    else {
        on_add_autoAdmin = true;
        on_edit_autoAdmin = false;
        ui->editarBtn->setEnabled(false);
        ui->eliminarBtn->setEnabled(false);
        ui->seccion->clear();
        ui->link->clear();
        ui->usuario->clear();
        ui->contrasenia->clear();
        ui->seccion->setEnabled(true);
        ui->link->setEnabled(true);
        ui->usuario->setEnabled(true);
        ui->contrasenia->setEnabled(true);
        ui->label_sec->setEnabled(true);
        ui->label_link->setEnabled(true);
        ui->label_us->setEnabled(true);
        ui->label_pass->setEnabled(true);
        ui->seccion->setFocus();
    }
}

void ABMAutoAdmin::on_guardarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Sección Autoadministrable"),
                                   "¿Está seguro que quiere "
                                   "guardar la sección '" + ui->seccion->text() + "'?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        // Se decide guardar la sección
        // Se seleccionó la opción de agregar un nuevo dominio.
        if (on_add_autoAdmin) {

            if (ui->seccion->text().isEmpty()) {
                QMessageBox::critical(this,"Insertar Autoadministrable",
                                      "Advertencia! Debe ingresar un valor para la sección");
                return;
            }
            if (ui->link->text().isEmpty()) {
                QMessageBox::critical(this,"Insertar Autoadministrable",
                                      "Advertencia! Debe ingresar un valor para el link");
                return;
            }
            if (ui->usuario->text().isEmpty()) {
                QMessageBox::critical(this,"Insertar Autoadministrable",
                                      "Advertencia! Debe ingresar un valor para el usuario");
                return;
            }
            if (ui->contrasenia->text().isEmpty()) {
                QMessageBox::critical(this,"Insertar Autoadministrable",
                                      "Advertencia! Debe ingresar un valor para la contraseña");
                return;
            }

            QSqlRecord record;

            // Se agrega la razon social
            QSqlField rsField(QStringLiteral("a_razon_social"), QVariant::String);
            rsField.setValue(ui->razon_social->text());
            record.append(rsField);
            // Se agrega la sección
            QSqlField secField(QStringLiteral("seccion"), QVariant::String);
            secField.setValue(ui->seccion->text());
            record.append(secField);
            // Se agrega el link
            QSqlField linkField(QStringLiteral("link"), QVariant::String);
            linkField.setValue(ui->link->text());
            record.append(linkField);
            // Se agrega el usuario
            QSqlField usField(QStringLiteral("usuario"), QVariant::String);
            usField.setValue(ui->usuario->text());
            record.append(usField);
            // Se agrega el contraseña
            QSqlField passField(QStringLiteral("contrasenia"), QVariant::String);
            passField.setValue(ui->contrasenia->text());
            record.append(passField);

            enjoylifedb.transaction();
            if (!(autoAdmin_model->insertRecord(-1, record))) {
                QString error = autoAdmin_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo insertar la Sección, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();

            SelectAutoadmins();
        }

        // El usuario hizo click sobre el boton editar.
        if (on_edit_autoAdmin) {
            QString filter = "id_autoadmin = '" + idAutoAdmin + "'";
            autoAdmin_model->setFilter(filter);
            enjoylifedb.transaction();
            if (!(autoAdmin_model->select())) {
                QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            if (autoAdmin_model->rowCount() == 1) {
                QSqlRecord record = autoAdmin_model->record(0);

                if (ui->seccion->text().isEmpty()) {
                    QMessageBox::critical(this,"Editar Autoadministrable",
                                          "Advertencia! Debe ingresar un valor para la sección");
                    return;
                }
                if (ui->link->text().isEmpty()) {
                    QMessageBox::critical(this,"Editar Autoadministrable",
                                          "Advertencia! Debe ingresar un valor para el link");
                    return;
                }
                if (ui->usuario->text().isEmpty()) {
                    QMessageBox::critical(this,"Editar Autoadministrable",
                                          "Advertencia! Debe ingresar un valor para el usuario");
                    return;
                }
                if (ui->contrasenia->text().isEmpty()) {
                    QMessageBox::critical(this,"Editar Autoadministrable",
                                          "Advertencia! Debe ingresar un valor para la contraseña");
                    return;
                }

                record.setValue("seccion", ui->seccion->text());
                record.setValue("link", ui->link->text());
                record.setValue("usuario", ui->usuario->text());
                record.setValue("contrasenia", ui->contrasenia->text());

                autoAdmin_model->setRecord(0, record);
                enjoylifedb.transaction();
                if (!autoAdmin_model->submitAll()) {
                    QString error = autoAdmin_model->lastError().text();
                    QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                            "\n %1").arg(error));
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
            }

            SelectAutoadmins();
        }
        row_edited = -1;
        on_add_autoAdmin = false;
        on_edit_autoAdmin = false;
        ui->agregarBtn->setEnabled(true);
        ui->editarBtn->setEnabled(false);
        ui->eliminarBtn->setEnabled(false);
        ui->seccion->clear();
        ui->link->clear();
        ui->usuario->clear();
        ui->contrasenia->clear();
        ui->seccion->setEnabled(false);
        ui->link->setEnabled(false);
        ui->usuario->setEnabled(false);
        ui->contrasenia->setEnabled(false);
        ui->label_sec->setEnabled(false);
        ui->label_link->setEnabled(false);
        ui->label_us->setEnabled(false);
        ui->label_pass->setEnabled(false);
    }
    else
        return;
}

void ABMAutoAdmin::on_eliminarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Eleminar Sección Autoadministrable"),
                                   "¿Está seguro que quiere "
                                   "eliminar la sección '" + ui->seccion->text() + "'?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        enjoylifedb.transaction();
        if (!autoAdmin_model->removeRow(ui->autoAdmin_view->currentIndex().row())) {
            QMessageBox::critical(this,"Error!", "No se pudo eliminar la seccón, vuelva a intentarlo.");
            enjoylifedb.rollback();
            return;
        }
        QMessageBox::information(this,"Exito!", "La sección fue eliminad correctamente.",
                                 QMessageBox::Ok);

        autoAdmin_model->submitAll();
        enjoylifedb.commit();
    }
    row_edited = -1;
    on_add_autoAdmin = false;
    on_edit_autoAdmin = false;
    ui->agregarBtn->setEnabled(true);
    ui->editarBtn->setEnabled(false);
    ui->eliminarBtn->setEnabled(false);
    ui->seccion->clear();
    ui->link->clear();
    ui->usuario->clear();
    ui->contrasenia->clear();
    ui->seccion->setEnabled(false);
    ui->link->setEnabled(false);
    ui->usuario->setEnabled(false);
    ui->contrasenia->setEnabled(false);
    ui->label_sec->setEnabled(false);
    ui->label_link->setEnabled(false);
    ui->label_us->setEnabled(false);
    ui->label_pass->setEnabled(false);
}

void ABMAutoAdmin::on_autoAdmin_view_clicked(const QModelIndex &index)
{
    if (index.row() != -1) {
        ui->editarBtn->setEnabled(true);
        ui->eliminarBtn->setEnabled(true);
        idAutoAdmin = autoAdmin_model->index(index.row(),0).data().toString();
        ui->seccion->setText(autoAdmin_model->index(index.row(),2).data().toString());
        ui->link->setText(autoAdmin_model->index(index.row(),3).data().toString());
        ui->usuario->setText(autoAdmin_model->index(index.row(),4).data().toString());
        ui->contrasenia->setText(autoAdmin_model->index(index.row(),5).data().toString());
        ui->seccion->setEnabled(false);
        ui->link->setEnabled(false);
        ui->usuario->setEnabled(false);
        ui->contrasenia->setEnabled(false);
        ui->label_sec->setEnabled(false);
        ui->label_link->setEnabled(false);
        ui->label_us->setEnabled(false);
        ui->label_pass->setEnabled(false);
    }
}

void ABMAutoAdmin::on_editarBtn_clicked()
{
    ui->seccion->setEnabled(true);
    ui->link->setEnabled(true);
    ui->usuario->setEnabled(true);
    ui->contrasenia->setEnabled(true);
    ui->label_sec->setEnabled(true);
    ui->label_link->setEnabled(true);
    ui->label_us->setEnabled(true);
    ui->label_pass->setEnabled(true);
    ui->seccion->setFocus();
    on_edit_autoAdmin = true;
    row_edited = ui->autoAdmin_view->currentIndex().row();
}

void ABMAutoAdmin::on_cerrarBtn_clicked()
{
    close();
}
